#ifndef DATAPROCESSOR_H
#define DATAPROCESSOR_H

#include "common.h"
#include "MulticastSender.h"

#include <QObject>
#include <QQueue>
#include <QMutex>
#include <QWaitCondition>
#include <string>

/**
 * @class DataProcessor
 * @brief 负责处理接收到的数据并发送命令的类
 *
 * 此类接收来自 `MulticastReceiver` 的数据，解析 MAVLink 消息，
 * 并根据需要发送命令消息到组播组。
 */
class DataProcessor : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param sender 引用 `MulticastSender` 对象，用于发送数据
     * @param parent 父对象
     */
    DataProcessor(MulticastSender& sender, QObject* parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~DataProcessor();

public slots:
    /**
     * @brief 接收数据并添加到处理队列
     * @param data 接收到的数据
     */
    void onDataReceived(const std::string& data);

signals:
    /**
     * @brief 发送数据包到组播组的信号
     * @param message 要发送的消息
     */
    void sendDataToMulticast(const std::string& message);

private slots:
    /**
     * @brief 数据处理线程的主函数
     */
    void processingLoop();

private:
    /**
     * @brief 处理收到的数据
     * @param data 接收到的数据
     */
    void processRecvData(const std::string& data);

    /**
     * @brief 发送命令数据包
     */
    void processSendData();

    /**
     * @brief 打印十六进制信息
     * @param data 要打印的数据
     */
    void printHex(const std::string& data);

    /**
     * @brief MAVLink CRC16 单字节累积校验
     * @param data 单个字节数据
     * @param crc_data 当前 CRC 值
     * @return 更新后的 CRC 值
     */
    u16 mavlinkCrc16AccumulateSingle(const u8 data, u16 crc_data);

    /**
     * @brief MAVLink CRC16 缓冲区累积校验
     * @param data_buffer 数据缓冲区
     * @param buffer_length 缓冲区长度
     * @return 计算后的 CRC16 值
     */
    u16 mavlinkCrc16Accumulate(const u8* data_buffer, s32 buffer_length);

    /**
     * @brief MAVLink 格式信息打包
     * @param data 数据内容
     * @param len 数据长度
     * @param msgID 消息 ID
     * @param dataOut 输出的数据包
     * @return 打包后的数据长度
     */
    s32 mavlinkMessagePacking(const void* data, const u8& len, u8 msgID, TMavlinkString* dataOut);

private:
    QQueue<std::string>   dataQueue;          ///< 数据队列
    QMutex                queueMutex;         ///< 保护队列的互斥量
    QWaitCondition        cv;                 ///< 条件变量用于同步
    bool                  running;            ///< 控制线程退出
    MulticastSender&      sender_;            ///< 引用 `MulticastSender` 对象，用于发送数据
};
#endif // DATAPROCESSOR_H
